perm filename FNTFAI.FAI[VIS,HPM]4 blob
sn#286902 filedate 1977-06-02 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE FNTFAI
C00003 00003 L3X2: POP P,RETAD L3X2(PIC,YLO,XLO,CHAR)
C00007 00004 L6X4: POP P,RETAD L6X4(PIC,YLO,XLO,CHAR)
C00011 00005 L1X1: POP P,RETAD L1X1(PIC,YLO,XLO,CHAR)
C00015 00006 L3Y4: POP P,RETAD L3Y4(PIC,YLO,XLO,CHAR)
C00019 00007 TITLE FNTVEC
C00023 ENDMK
C⊗;
TITLE FNTFAI
ENTRY L3X2, L3Y4, L6X4
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14
T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ PICPNT←5 ↔ BITPNT←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YEX←14 ↔ PICPT2←CHAR←15
P←17
RETAD: 0
L3X2: POP P,RETAD ; L3X2(PIC,YLO,XLO,CHAR)
POP P,CHAR ;routine to assemble a 3 by 2 compressed character.
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
ASH T,-1
SUB T,PCLN(PIC)
ASH T,1
CAILE T,0
SUB YEX,T
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,3 ;get position of starting bit
IDIVI XHI,3 ;and finishing bit
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT1 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT1: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,2 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE TT,BPTAB(PIC) ;set up skeleton byte pointer
ADD TT,XLO ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ;loop counter for Y, neg count in left *****
HRL YLO,YEX ; <TWICE> line number in right
YLOOP: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-1 ;line address for current Y position
ADDI TT,LINTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL(XLR) ;one
FWL: ILDB TT,PICPNT ;and then do all the others but the last
STL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL
ILDB TT,PICPNT ;the last affected byte
JRST RTL(XHR) ;see how much of it to do
RTL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP ;check if all lines done
POP P,12
JRST @RETAD
L6X4: POP P,RETAD ; L6X4(PIC,YLO,XLO,CHAR)
POP P,CHAR
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
ASH T,-2
SUB T,PCLN(PIC)
ASH T,2
CAILE T,0
SUB YEX,T
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,6 ;get position of starting bit
IDIVI XHI,6 ;and finishing bit
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT3 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT3: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,5 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE TT,BPTAB(PIC) ;set up skeleton byte pointer
ADD TT,XLO ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ; loop counter for Y, neg count in left
HRL YLO,YEX ; <TWICE> line number in right
YLOOP3: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-2 ;line address for current Y position
ADDI TT,LINTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL3(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL3(XLR) ;one
FWL3: ILDB TT,PICPNT ;and then do all the others but the last
STL3: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL3
ILDB TT,PICPNT ;the last affected byte
JRST RTL3(XHR) ;see how much of it to do
RTL3: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP3 ;check if all lines done
POP P,12
JRST @RETAD
L1X1: POP P,RETAD ; L1X1(PIC,YLO,XLO,CHAR)
POP P,CHAR ;routine to assemble an uncompressed character.
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
SUB T,PCLN(PIC)
CAILE T,0
SUB YEX,T
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,1 ;get position of starting bit
IDIVI XHI,1 ;and finishing bit
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT1 ;and if exactly one byte,
GT1: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,2 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE TT,BPTAB(PIC) ;set up skeleton byte pointer
ADD TT,XLO ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ;loop counter for Y, neg count in left *****
HRL YLO,YEX ; <TWICE> line number in right
YLOOP: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-1 ;line address for current Y position
ADDI TT,LINTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL(XLR) ;one
FWL: ILDB TT,PICPNT ;and then do all the others but the last
STL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL
ILDB TT,PICPNT ;the last affected byte
JRST RTL(XHR) ;see how much of it to do
RTL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP ;check if all lines done
POP P,12
JRST @RETAD
L3Y4: POP P,RETAD ; L3Y4(PIC,YLO,XLO,CHAR)
POP P,CHAR ;for sideways full pages
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
ASH T,-2
SUB T,LNBY(PIC)
ASH T,2
CAILE T,0
SUB YEX,T
JUMPE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,3 ;get position of starting bit
IDIVI XHI,3 ;and finishing bit
CAML XHI,PCLN(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT2 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT2: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,2 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVEI TT,LINTAB(PIC) ;set up skeleton byte pointer
ADD TT,PCLN(PIC)
SUBI TT,1(XLO) ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ; loop counter for Y, neg count in left
HRL YLO,YEX ; <TWICE> line number in right
YLOOP2: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-2 ;line address for current Y position
ADD TT,BPTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL2(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL2(XLR) ;one
FWL2: SUB PICPNT,LNWD(PIC)
LDB TT,PICPNT ;and then do all the others but the last
STL2: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL2
SUB PICPNT,LNWD(PIC)
LDB TT,PICPNT ;the last affected byte
JRST RTL2(XHR) ;see how much of it to do
RTL2: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP2 ;check if all lines done
POP P,12
JRST @RETAD
PRGEND
TITLE FNTVEC
ENTRY V3X2
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14
T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ XD←5 ↔ XDR←XWID←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ YD←12 ↔ NFWD←13 ↔ YEX←14 ↔ PICPNT←15
P←17
RETAD: 0
V3X2: POP P,RETAD ; V3X2(PIC,YLO,XLO,XWID,XD,YD)
POP P,YD ;routine to make a vector xd wide, yd long slope xwid
POP P,XD
POP P,XWID
POP P,XLO
POP P,YLO
POP P,PIC
MOVE XHI,XLO
ADD XHI,-1(XWID)
IDIVI XLO,3
IDIVI XHI,3
IDIVI XD,3
YLP: HRRZ TT,YLO
ASH TT,-1
ADDI TT,LINTAB(PIC)
MOVE PICPNT,(TT)
MOVEI TT,-1(XLO)
ADD TT,BPTAB(TT)
ADD PICPNT,(TT)
MOVE NFWD,XHI
SUBI NFWD,1(XLO)
MOVE TT,XHR
JUMPGE NFWD,FRB
SUB TT,XLR
JRST LSB
FRB: ILDB T,PICPNT ;for first fractional byte
ADD T,(XLR)[3
2
1]
CAMLE T,BMAX(PIC)
MOVE T,BMAX(PIC)
DPB T,PICPNT
JUMPE NFWD,LSB
FLP: ILDB T,PICPNT ;for middle full bytes
ADDI T,3
CAMLE T,BMAX(PIC)
MOVE T,BMAX(PIC)
DPB T,PICPNT
SOJG NFWD,FLP
LSB: ILDB T,PICPNT ;for last fractional byte
ADDI T,1(TT)
CAMLE T,BMAX(PIC)
MOVE T,BMAX(PIC)
DPB T,PICPNT
DADD XLO,XD
CAIL XLR,3
DSUB XLO,[-1
3]
DADD XHI,XD
CAIL XHR,3
DSUB XHI,[-1
3]
AOBJN YLO,YLP
END